#include<stdio.h>
#include<assert.h>
#include"sqlist.h"

//不可扩容的顺序表
//初始化
//结构体指针不为空，即为初始化
void InitSqlist(PSQList ps)
{
	assert(ps != NULL);
	if (ps == NULL)
	{
		return;
	}
}

//判空
//若有效个数为0，那么是空的
bool IsEmpty(PSQList ps)
{
	assert(ps != NULL);
	if (ps == NULL)
		return false;
	return ps->length == 0;
}




//判满
//若有效个数是10，那么是满的
static bool IsFull(PSQList ps)
{
	if (ps->length == 10)
		return true;
	else
		return false;
}


//插入数据，在ps顺序表的pos位置插入val；
bool Insert(PSQList ps, int pos, int val)
{
	//参数判断，需要考虑使用者所使用的数据，程序的健壮性
	assert(ps != NULL);
	if (ps == NULL)
		return false;

	//负数的位置和超过有效个数的位置是不能插入的，
	if (pos > ps->length || pos < 0)
		return false;
	//1.把数据移动到后面	2.插入数据		3.有效数据的个数++
	for (int i = ps->length - 1;i >= pos;i--)
	{
		ps->arr[i + 1] = ps->arr[i];
	}
	ps->arr[pos] = val;
	
	ps->length++; //有效的数据个数要+1
	return true;
}




//在ps中查找第一个key值，找到返回下标i，没有找到返回-1
int Search(PSQList ps, int key)
{
	//先进行判空
	assert(ps != NULL);
	if (ps == NULL)
		return false;
	
	//遍历一遍，找到返回下标i，没有找到返回-1
	for (int i = 0;i < ps->length;i++)
	{
		if (ps->arr[i] == key)
			return i;
	}
	return -1;
}





//删除pos位置的值
bool DelPos(PSQList ps, int pos)   //Del：Delete Position 
{
	//参数判断
	assert(ps != NULL);
	if (ps == NULL)
		return false;

	//若删除的位置小于0或者大于等于有效个数时，返回false
	if (pos < 0 || pos >= ps->length)
	{
		return false;
	}

	//后面的数据前移
	for (int i = pos; i+1 < ps->length; i++)//判断边界，判断哪一个是最后一个
	{
		ps->arr[i] = ps->arr[i + 1];  //把下一个位置的值赋值给前一个
	}
	//有效数据--；
	ps->length--;
	
	return true;

}


//删除第一个Val的值
bool DelVal(PSQList ps, int val)
{
	int i = Search(ps, val);
	if (i<0)
		return false;
	return DelPos(ps, i);
}






//返回key的前驱下标，如果不存在返回-1
int GetPrio(PSQList ps, int key)
{
	int i = Search(ps, key);
	if (i <= 0) //注意头没有前驱
		return -1;
	return i - 1;
}

//返回key的后继下标，如果不存在返回-1
int GetNext(PSQList ps, int key)
{
	int i = Search(ps, key);
	if (i < 0 || i == ps->length)//尾没有后继
			return -1;
	return i + 1;
}

//输出
void Show(PSQList ps)
{
	assert(ps != NULL);
	if (ps == NULL)
		return;
	
	for (int i = 0;i < ps->length;i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}

//清空数据
void  Clear(PSQList ps)
{
	ps->length = 0; //有效数据为0
}

//销毁整个内存
void Destroy(PSQList ps)
{
	Clear(ps);
}







